//判断是否为对象
const isObject = obj => {
  return Object.prototype.toString.call(obj) === '[object Object]'
}

//判断是否为数组
const isArray = arr => {
  return Object.prototype.toString.call(arr) === '[object Array]'
}

/*******
 * @description: 判断对象是否相同
 * @author: 琴时
 * @param {DataFirst} [比较的第一个参数]
 * @param {DataSecond} [比较的第二个参数]
 * @return {Boolean}
 */
const equalsObj = (DataFirst, DataSecond) => {
  // 类型为基本类型时,如果相同,则返回true
  if (DataFirst === DataSecond) return true
  if (
    isObject(DataFirst) &&
    isObject(DataSecond) &&
    Object.keys(DataFirst).length === Object.keys(DataSecond).length
  ) {
    // 若两个参数都为对象，先判断对象长度是否相同
    // 遍历对象内元素是否相同
    for (const key in DataFirst) {
      if (DataFirst.hasOwnProperty(key)) {
        if (!equalsObj(DataFirst[key], DataSecond[key]))
          // 对象中具有不相同属性 返回false
          return false
      }
    }
  } else if (
    isArray(DataFirst) &&
    isArray(DataSecond) &&
    DataFirst.length === DataSecond.length
  ) {
    // 若两个参数都为数组，则先判断数组长度是否相同
    //遍历数组值是否相同
    for (let i = 0, length = DataFirst.length; i < length; i++) {
      if (!equalsObj(DataFirst[i], DataSecond[i]))
        // 如果数组元素中具有不相同元素,返回false
        return false
    }
  } else {
    // 其它类型,均返回false
    return false
  }
  return true
}

export default equalsObj
